স্প্রিং ফ্রেমওয়ার্কে ট্রানজ্যাকশন ম্যানেজমেন্ট একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। এটি ডেটাবেসে Atomicity, Consistency, Isolation, এবং Durability (ACID) প্রিন্সিপাল মেনে ডেটা পরিচালনা নিশ্চিত করে। স্প্রিং ORM ট্রানজ্যাকশন পরিচালনার জন্য Declarative এবং Programmatic পদ্ধতি প্রদান করে। সাধারণত Declarative পদ্ধতি সবচেয়ে বেশি ব্যবহৃত হয় কারণ এটি সরল ও কার্যকর।
এটি অ্যানোটেশন বা XML কনফিগারেশনের মাধ্যমে ট্রানজ্যাকশন পরিচালনা করে। কোডে কম জটিলতা থাকে এবং সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়।
এটি ম্যানুয়ালি ট্রানজ্যাকশন শুরু এবং শেষ করার জন্য TransactionTemplate বা PlatformTransactionManager ব্যবহার করে।
pom.xml
ফাইলে ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId> <!-- H2 ডাটাবেস ব্যবহার -->
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String accountHolder;
private Double balance;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAccountHolder() {
return accountHolder;
}
public void setAccountHolder(String accountHolder) {
this.accountHolder = accountHolder;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<Account, Long> {
}
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AccountService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transfer(Long fromAccountId, Long toAccountId, Double amount) {
Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
Account toAccount = accountRepository.findById(toAccountId).orElseThrow();
if (fromAccount.getBalance() < amount) {
throw new IllegalArgumentException("Insufficient balance");
}
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/accounts")
public class AccountController {
@Autowired
private AccountService accountService;
@PostMapping("/transfer")
public String transfer(@RequestParam Long fromAccountId,
@RequestParam Long toAccountId,
@RequestParam Double amount) {
accountService.transfer(fromAccountId, toAccountId, amount);
return "Transfer successful!";
}
}
application.properties
ফাইলে ডাটাবেস কনফিগারেশন যোগ করুন:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
/accounts/transfer
এ ডাটা পাঠান।@Transactional
অ্যানোটেশন ব্যবহার করা হয়েছে, যা নিশ্চিত করে যে ট্রানজ্যাকশন সফল হলে ডাটাবেসে পরিবর্তন সংরক্ষিত হবে। ব্যর্থ হলে সমস্ত অপারেশন রোলব্যাক (Rollback) হবে।স্প্রিং ORM-এ ট্রানজ্যাকশন ম্যানেজমেন্ট সহজ এবং কার্যকর। @Transactional
অ্যানোটেশন ব্যবহার করে Declarative পদ্ধতিতে ডেটাবেস অপারেশন পরিচালনা করা যায়। এটি ডেটা কনসিস্টেন্সি নিশ্চিত করে এবং ডেভেলপারদের জটিল কোড লিখতে হয় না।
Read more